package com.saver.view.adapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;

import com.saver.core.domain.Establecimiento;
import com.saver.core.persistence.EstablecimientoRestService;
import com.saver.core.persistence.EstablecimientoSQLite;
import com.saver.core.persistence.bean.ItemEstablecimiento;
import com.saver.core.processor.util.Util;
import com.saver.core.util.Constantes;

public class PlacesAutoCompleteAdapter extends ArrayAdapter<ItemEstablecimiento> implements Filterable {
	
	private static final String TAG = "PlacesAutoCompleteAdapter";
	
	private EstablecimientoSQLite establecimientoSQLite;
	private EstablecimientoRestService establecimientoRestService;
	private List<ItemEstablecimiento> resultList;
	private ResetAutoComplete resetAutoComplete;

	public PlacesAutoCompleteAdapter(Context context, int textViewResourceId,
			EstablecimientoSQLite establecimientoSQLite,
			EstablecimientoRestService establecimientoRestService,
			ResetAutoComplete resetAutoComplete) {
		super(context, textViewResourceId);
		
		this.establecimientoSQLite = establecimientoSQLite;
		this.establecimientoRestService = establecimientoRestService;
		this.resetAutoComplete = resetAutoComplete;
	}
    
    @Override
    public int getCount() {
        return resultList.size();
    }

    @Override
    public ItemEstablecimiento getItem(int index) {
        return resultList.get(index);
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
            	resetAutoComplete.reset();
                FilterResults filterResults = new FilterResults();
                String texto = constraint == null ? null : constraint.toString();
                
                if (!Util.esVacio(texto)) {
                	if (Util.tieneConexionInternet(getContext())) {
                		HashMap<String, String> parametros = new HashMap<String, String>();
                		parametros.put(Constantes.PARAM_EST_CANTIDAD, Constantes.EST_NUMERO_REGISTROS);
                		parametros.put(Constantes.PARAM_EST_TEXTO, texto);
                        try {
							resultList = establecimientoRestService.establecimientos(parametros);
						} catch (Exception e) {
							Log.w(TAG, "Error al obtener establecimientos, se buscara de la base de datos local", e);
							resultList = crearLista(texto);
						}
                        
                	} else {
                		resultList = crearLista(texto);
                	}
                	
                    filterResults.values = resultList;
                    filterResults.count = resultList.size();
                }
                
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                if (results != null && results.count > 0) {
                    notifyDataSetChanged();
                }
                else {
                    notifyDataSetInvalidated();
                }
            }};
        return filter;
    }

	private List<ItemEstablecimiento> crearLista(String texto) {
		List<Establecimiento> establecimientos = establecimientoSQLite.buscarPorNombreLike(texto);
		ArrayList<ItemEstablecimiento> items = new ArrayList<ItemEstablecimiento>();
		for (Establecimiento establecimiento : establecimientos) {
			ItemEstablecimiento itemEstablecimiento = new ItemEstablecimiento();
			itemEstablecimiento.setIdServ(establecimiento.getIdEstablecimiento());
			itemEstablecimiento.setNombre(establecimiento.getNombre());
			itemEstablecimiento.setTipoRegistro(establecimiento.getTipo());
			items.add(itemEstablecimiento);
		}
		return items;
	}

}
